/**
 * @file test_for_hash.c
 * @version V0.01
 * @brief 《嵌入式软件开发笔记》中的关于 # 和 ## 的用法测试
 * @brief # 字符串化操作符 ## 符号连接操作符
 * @author 陈吉
 * @date 2024-08-29
 * @copyright Copyright (c) 2024, chenji 
 * All rights reserved.
 */
#include "test_for_hash.h"

void test_for_hash(void)
{
    int num9 = 90;
    char str[128] = "xxx";
    const char* string = example(test_for_hash); //test_for_hash 会被转换为字符串
    STRCPY(str, CCC); //CCC 会被转换为字符串
    int b = example2(9); //example2(9) 会被转换为 num9
    printf("\r\ntest_for \"#\": %s\r\n", string);
    printf("test_for \"#\" : %s\r\n", str);
    printf("test_for \"##\" : %d\r\n", b);

    /**
     * @brief 当宏参数是另一个宏的时候，需要注意的是凡宏定义里有用’#’或’##’的地方宏参数是不会再展开，
     * 只有当前宏生效，参数里的宏不会生效。编译时会出错的。
     * @brief 
     */
    // 下面这个调用就会出现编译错误，所以要经过宏转换，才能调用该宏定义
    // printf("test_for \"##\": %d", CONS(A));

    // 下面这个调用则不会出现编译错误，可以直接调用该宏定义
    int xx = CONS(A, A);
    printf("test_for \"#\": %s\r\n", STR(A));
    printf("test_for \"##\": %d", xx);
}